package antrace;

public class PlayerController implements InterfaceController {

	// variabler
	// TODO fixa bättre namn än dx/dy?
	private int dx;
	private int dy;
	private AntSprite ant;

	// konstruktor
	public PlayerController(AntSprite sprite) {
		this.dx = this.dy = 0;
		ant = sprite;
	}

	// metoder
	public void keyPressed(int key) {
		// undviker dubbla (sneda) riktningar
		this.dx = this.dy = 0;
		
		if (!ant.isDead()) {
			switch (key) {
			case AntRace.LEFT:
			case AntRace.KEY_FOUR:
				if(ant.getLockedDirection() != AntSprite.DIRECTION_LEFT)
				{
					this.dx = -1;
					ant.setState(AntSprite.STATE_WALKING);
					ant.setLockedDirection(10);
				}
				break;
			case AntRace.RIGHT:
			case AntRace.KEY_SIX:
				if(ant.getLockedDirection() != AntSprite.DIRECTION_RIGHT)
				{
					this.dx = 1;
					ant.setState(AntSprite.STATE_WALKING);
					ant.setLockedDirection(10);
				}
				break;
			case AntRace.UP:
			case AntRace.KEY_TWO:
				if(ant.getLockedDirection() != AntSprite.DIRECTION_UP)
				{
					this.dy = -1;
					ant.setState(AntSprite.STATE_WALKING);
					ant.setLockedDirection(10);
				}
				break;
			case AntRace.DOWN:
			case AntRace.KEY_EIGHT:
				if(ant.getLockedDirection() != AntSprite.DIRECTION_DOWN)
				{
					this.dy = 1;
					ant.setState(AntSprite.STATE_WALKING);
					ant.setLockedDirection(10);
				}
				break;
			case AntRace.FIRE:
			case AntRace.KEY_FIVE:
				ant.useBonus(ant.currentBonus());
				break;
			}
		}
		
		switch(key) {
		case AntRace.SOFTKEY1:
			AntRace.game.saveHighscore();
			AntRace.menu.highscore.update();
			System.out.println("Highscore uppdaterat!");
			AntRace.game.setLastFrame();
			AntRace.game.ingameMenu.toggleVisible();
			break;
		case AntRace.SOFTKEY2:
			AntRace.viewManager.currentView = AntRace.menu;
			break;
		}
		
		//public void softkeyPressed("label") { 
//
		//}
		
		// för att inte låsa sig när vi testar :P
		if ( (key == AntRace.FIRE || key == AntRace.KEY_FIVE)&& ant.isDead()) {
			ant.revive();
		}
	}
	
	/**
	 * Sätt hastighet till noll när rätt tangent släpps.
	 * @param key keycode för vilken tangent som är nedtryckt
	 */
	public void keyReleased(int key) {
		boolean movingLeftOrRight = key == AntRace.LEFT || key == AntRace.RIGHT ||
				key == AntRace.KEY_FOUR || key == AntRace.KEY_SIX;
		boolean movingUpOrDown = key == AntRace.UP || key == AntRace.DOWN || 
				key == AntRace.KEY_TWO || key == AntRace.KEY_EIGHT;
		if(movingLeftOrRight) {
			this.dx = 0;
		}
		if(movingUpOrDown) {
			this.dy = 0;
		}
	}

	/* FIXME den här metoden känns som man skulle kunna kommentera
	 och refaktorisera en hel del. Väldigt djupt nästlad och inga
	 kommentarer som det är nu... */
	public void update() {
		if (!ant.isDead()) {
			int difX = (ant.getWorldX() + 10) % 20;
			int difY = (ant.getWorldY() + 10) % 20;
			
			int newX = (ant.getWorldX() + 10 + dx*ant.getVelocity()) % 20;
			int newY = (ant.getWorldY() + 10 + dy*ant.getVelocity()) % 20; 
			
			if( newX == 10 || newY == 10 ) {
					ant.move(dx,dy,true);
			}
			else {
				if( dy != 0 ) {
					if((difX - 10) < 0) {
						ant.move(1, 0, false);
					}
					else {
						ant.move(-1, 0, false);
					}
				}
				
				if( dx != 0 ) {
					if((difY - 10) < 0) {
						ant.move(0, 1, false);
					}
					else {
						ant.move(0, -1, false);
					}
				}
			}
		}
	}

}
